﻿using System;
using System.ComponentModel;
using System.Windows.Forms;
using Agenda.Model.Entities;
using Agenda.Model.Enum;
using DDotNet.ORMapping.Exception;

namespace Agenda
{
    public partial class FormTelefone : Form
    {
        #region Construtor

        private FormTelefone()
        {
            InitializeComponent();
        }

        public FormTelefone(RegistroAgenda registroAgenda) : this()
        {
            // Preenche as ComboBox
            this.FillLists();

            // Configura Campos
            this._RegistroAgenda = registroAgenda;

            // Configura Grid
            this.dataGridView1.AutoGenerateColumns = false;
            
            // Inicializa Edição
            this._RegistroAgenda.Telefones.BeginEdit();
            
            // Adiciona Evento
            this._RegistroAgenda.Telefones.ListChanged += new ListChangedEventHandler(Telefones_ListChanged);

            // Configura BindingSource
            this.bindingSourceTelefone.DataSource = this._RegistroAgenda.Telefones;

            // Configura o Título do Formulário
            this.Text = string.Format(this.Text, registroAgenda.Nome);

            // Dispara Evento para Configurar os Botões da Toolstrip
            this.Telefones_ListChanged(null, null);
        }

        #endregion

        #region Campos

        /// <summary>
        /// Contém a Referência do Registro de Agenda Atual
        /// </summary>
        private RegistroAgenda _RegistroAgenda = null;

        private bool _AcaoCancelada = false;
        
        #endregion

        #region Eventos

        void Telefones_ListChanged(object sender, ListChangedEventArgs e)
        {
            this.toolStripButtonExcluir.Enabled = this._RegistroAgenda.Telefones.Count > 0;
        }

        private void textBoxRecado_TextChanged(object sender, EventArgs e)
        {
            this.Validate();
        }

        private void textBoxRamal_TextChanged(object sender, EventArgs e)
        {
            this.Validate();
        }

        private void maskedTextBoxCodigoPais_TextChanged(object sender, EventArgs e)
        {
            this.Validate();
        }

        private void maskedTextBoxDDD_TextChanged(object sender, EventArgs e)
        {
            this.Validate();
        }

        private void maskedTextBoxTelefone_TextChanged(object sender, EventArgs e)
        {
            this.Validate();
        }

        private void toolStripButtonCancelar_Click(object sender, EventArgs e)
        {
            // Configura a Flag para não Exibir a MessageBox
            this._AcaoCancelada = true;
            
            // Fecha a Janela
            this.Close();
        }

        private void toolStripButtonSalvar_Click(object sender, EventArgs e)
        {
            // Aceita as Modificações
            this.bindingSourceTelefone.EndEdit();

            // Fecha a Janela
            this.Close();
        }

        private void toolStripButtonExcluir_Click(object sender, EventArgs e)
        {
            try
            {
                // Remove da Coleção
                this.bindingSourceTelefone.RemoveCurrent();

                // Notifica o BindingSource para Atualizar os Controles
                this.bindingSourceTelefone.CurrencyManager.Refresh();

                // Emite Mensagem
                MessageBox.Show("O Telefone Somente será Excluido do Banco de Dados quando o Contato for Salvo", "Exclusão de Contato", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (ValidationException ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void toolStripButtonNovo_Click(object sender, EventArgs e)
        {
            // Adiciona um Item pelo BindingSource
            this.bindingSourceTelefone.AddNew();

            // Notifica o BindingSource para Atualizar os Controles
            this.bindingSourceTelefone.CurrencyManager.Refresh();

            // Seta o Foco no Número de Telefone
            this.maskedTextBoxTelefone.Focus();
        }

        ///<summary>
        ///Raises the <see cref="E:System.Windows.Forms.Form.Closing"></see> event.
        ///</summary>
        ///
        ///<param name="e">A <see cref="T:System.ComponentModel.CancelEventArgs"></see> that contains the event data. </param>
        protected override void OnClosing(CancelEventArgs e)
        {
            // Verifica se pode exibir a Mensagem
            if (!this._AcaoCancelada)
            {
                // Realiza a Persistência da Edição dos Itens da Coleção
                this._RegistroAgenda.Telefones.EndEdit();
                
                // Emite Mensagem
                MessageBox.Show("As alterações realizadas só serão persistidas quando o contato for salvo.",
                                "Edição de telefones", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }
            else
            {
                // Realiza o Cancelamento da Edição dos Itens da Coleção
                this._RegistroAgenda.Telefones.CancelEdit();
            }

            base.OnClosing(e);
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Preenche as Combos do Form
        /// </summary>
        private void FillLists()
        {
            this.comboBoxTipoTelefone.Items.Add(TipoTelefone.Residencial);
            this.comboBoxTipoTelefone.Items.Add(TipoTelefone.Comercial);
            this.comboBoxTipoTelefone.Items.Add(TipoTelefone.Celular);
        }

        #endregion
    }
}